package redis_db

import (
	"github.com/redis/go-redis/v9"
	"time"
)

type IRedis interface {

	//Exist
	//确定密钥是否在Redis中
	Exist(key string) bool
	//Delete
	//从Redis删除键值对
	Delete(key string) (bool, error)

	//Set
	//操作字符串类型，写数据到Redis
	//t为过期时间，单位为秒，0表示无过期时间
	Set(key string, data interface{}, t time.Duration) error

	SetAny(key string, data interface{}, t time.Duration) error

	//Get
	//操作字符串类型，从Redis读取数据
	Get(key string) (string, error)

	//HSet
	//操作哈希类型，从哈希结构读取数据
	HSet(key string, id string, data interface{}) error

	//HSetAny
	//Manipulate Hash types, write any data to Redis, implements ttl
	HSetAny(key string, id string, data interface{}, t time.Duration) error

	//HGet
	//操作Hash类型, 从Hash结构中读取数据
	//key 是Redis查找Hash结构的key
	//k   是Hash结构内k-v中的k
	HGet(key string, k string) (string, error)

	//HMGet
	//操作Hash类型, 从Hash结构中批量读取数据
	//key 是Redis查找Hash结构的key
	//k...不定参数 类型string
	HMGet(key string, k ...string) ([]interface{}, error)

	//HGetAll
	//操作Hash类型, 从Hash结构中读取key的所有数据
	//key 是Redis查找Hash结构的key
	HGetAll(key string) (map[string]string, error)

	//HExist
	//操作Hash类型, 判断key存在于Hash结构中
	HExist(key string, k string) bool

	//HDelete
	//操作Hash类型, 从Hash结构中删除数据
	//key 是Redis查找Hash结构的key
	//k   是Hash结构内k-v中的k
	HDelete(key string, k string) (bool, error)

	//List 相关操作

	//LPush 操作List类型, 将新元素从表头推入List
	LPush(key string, value interface{}) error

	//RPush 操作List类型, 将新元素从表尾推入List
	RPush(key string, value interface{}) error

	//LLen 操作List类型, 返回List内元素个数
	LLen(key string) (int64, error)

	//LRange 操作List类型, 返回指定范围内元素
	LRange(key string, start int64, stop int64) ([]string, error)

	//LRemove 操作List类型, 从表尾向表头搜索移除1个Value
	LRemove(key string, value interface{}) error

	//Set 相关操作

	//SAdd 操作Set类型, 将数据member写入Set结构中
	SAdd(key string, member string) error

	//SRemove 操作Set类型, 将数据member从Set结构中移除
	SRemove(key string, member string) error

	//SIsMember 操作Set类型, 判断member在Set结构中
	SIsMember(key string, member string) bool

	//ZSet 相关操作

	//ZAdd 操作ZSet类型, 将Member写入ZSet结构中
	ZAdd(key string, member interface{}, score float64) error

	//ZCount 操作ZSet类型, 统计分值在给定范围内节点数量
	ZCount(key string, min string, max string) (int64, error)

	//ZRange 操作ZSet类型, 返回给定范围内所有元素
	ZRange(key string, start int64, stop int64) ([]string, error)

	//ZRemove 操作ZSet类型, 删除包含给定成员的所有节点和分值节点
	ZRemove(key string, member interface{}) error

	//Pipeline 异步操作
	Pipeline() redis.Pipeliner
}

func NewMemCache(mem IRedis) IRedis {

	return mem
}
